{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Implementing a one-layer Neural Network\n",
    "\n",
    "\n",
    "We will illustrate how to create a one hidden layer NN\n",
    "\n",
    "We will use the iris data for this exercise\n",
    "\n",
    "We will build a one-hidden layer neural network  to predict the fourth attribute, Petal Width from the other three (Sepal length, Sepal width, Petal length)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from sklearn import datasets\n",
    "from tensorflow.python.framework import ops"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "ops.reset_default_graph()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "iris = datasets.load_iris()\n",
    "x_vals = np.array([x[0:3] for x in iris.data])\n",
    "y_vals = np.array([x[3] for x in iris.data])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Create graph session \n",
    "sess = tf.Session()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# make results reproducible\n",
    "seed = 2\n",
    "tf.set_random_seed(seed)\n",
    "np.random.seed(seed)  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Split data into train/test = 80%/20%\n",
    "train_indices = np.random.choice(len(x_vals), round(len(x_vals)*0.8), replace=False)\n",
    "test_indices = np.array(list(set(range(len(x_vals))) - set(train_indices)))\n",
    "x_vals_train = x_vals[train_indices]\n",
    "x_vals_test = x_vals[test_indices]\n",
    "y_vals_train = y_vals[train_indices]\n",
    "y_vals_test = y_vals[test_indices]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Normalize by column (min-max norm)\n",
    "def normalize_cols(m):\n",
    "    col_max = m.max(axis=0)\n",
    "    col_min = m.min(axis=0)\n",
    "    return (m-col_min) / (col_max - col_min)\n",
    "    \n",
    "x_vals_train = np.nan_to_num(normalize_cols(x_vals_train))\n",
    "x_vals_test = np.nan_to_num(normalize_cols(x_vals_test))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Declare batch size\n",
    "batch_size = 50\n",
    "\n",
    "# Initialize placeholders\n",
    "x_data = tf.placeholder(shape=[None, 3], dtype=tf.float32)\n",
    "y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Create variables for both NN layers\n",
    "hidden_layer_nodes = 10\n",
    "A1 = tf.Variable(tf.random_normal(shape=[3,hidden_layer_nodes])) # inputs -> hidden nodes\n",
    "b1 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes]))   # one biases for each hidden node\n",
    "A2 = tf.Variable(tf.random_normal(shape=[hidden_layer_nodes,1])) # hidden inputs -> 1 output\n",
    "b2 = tf.Variable(tf.random_normal(shape=[1]))   # 1 bias for the output\n",
    "\n",
    "\n",
    "# Declare model operations\n",
    "hidden_output = tf.nn.relu(tf.add(tf.matmul(x_data, A1), b1))\n",
    "final_output = tf.nn.relu(tf.add(tf.matmul(hidden_output, A2), b2))\n",
    "\n",
    "# Declare loss function (MSE)\n",
    "loss = tf.reduce_mean(tf.square(y_target - final_output))\n",
    "\n",
    "# Declare optimizer\n",
    "my_opt = tf.train.GradientDescentOptimizer(0.005)\n",
    "train_step = my_opt.minimize(loss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Generation: 50. Loss = 0.527901\n",
      "Generation: 100. Loss = 0.228715\n",
      "Generation: 150. Loss = 0.179773\n",
      "Generation: 200. Loss = 0.107899\n",
      "Generation: 250. Loss = 0.240029\n",
      "Generation: 300. Loss = 0.15324\n",
      "Generation: 350. Loss = 0.165901\n",
      "Generation: 400. Loss = 0.0957248\n",
      "Generation: 450. Loss = 0.121014\n",
      "Generation: 500. Loss = 0.129494\n"
     ]
    }
   ],
   "source": [
    "# Initialize variables\n",
    "init = tf.global_variables_initializer()\n",
    "sess.run(init)\n",
    "\n",
    "# Training loop\n",
    "loss_vec = []\n",
    "test_loss = []\n",
    "for i in range(500):\n",
    "    rand_index = np.random.choice(len(x_vals_train), size=batch_size)\n",
    "    rand_x = x_vals_train[rand_index]\n",
    "    rand_y = np.transpose([y_vals_train[rand_index]])\n",
    "    sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})\n",
    "\n",
    "    temp_loss = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})\n",
    "    loss_vec.append(np.sqrt(temp_loss))\n",
    "    \n",
    "    test_temp_loss = sess.run(loss, feed_dict={x_data: x_vals_test, y_target: np.transpose([y_vals_test])})\n",
    "    test_loss.append(np.sqrt(test_temp_loss))\n",
    "    if (i+1)%50==0:\n",
    "        print('Generation: ' + str(i+1) + '. Loss = ' + str(temp_loss))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x117be7550>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "# Plot loss (MSE) over time\n",
    "plt.plot(loss_vec, 'k-', label='Train Loss')\n",
    "plt.plot(test_loss, 'r--', label='Test Loss')\n",
    "plt.title('Loss (MSE) per Generation')\n",
    "plt.legend(loc='upper right')\n",
    "plt.xlabel('Generation')\n",
    "plt.ylabel('Loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda env:tf-cpu]",
   "language": "python",
   "name": "conda-env-tf-cpu-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
